package cn.itsuorce.interceptor;

import cn.itsuorce.utils.AjaxResult;
import cn.itsuorce.utils.RedisUtils;
import com.alibaba.fastjson.JSON;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class LoginInterceptor implements HandlerInterceptor {

    /**
     * 处理请求之前（请求到达Controller接口之前）
     * pre：previous的简写
     * 拦截请求，判断用户是否已经登录：
     * 若已经登录，则直接放行，return true就表示放行；
     * 若未登录，则返回提示信息json数据，前端再跳转到登录页面
     *
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //从请求头中获取UserToken
        String userToken = request.getHeader("UserToken");
        //判断
        if (StringUtils.hasText(userToken)) {
            //再以这个userToken为key，从Redis中获取用户对象
            String loginUserJsonStr = RedisUtils.INSTANCE.get(userToken);
            if (StringUtils.hasText(loginUserJsonStr)) {
                //刷新过期时间 重新设置30分钟
                RedisUtils.INSTANCE.set(userToken, loginUserJsonStr, 30 * 60);
                return true;
            }
        }

        //返回json数据
        AjaxResult ajaxResult = AjaxResult.me().setSuccess(false).setMsg("nouser");
        //下面这几行代码，就是@ResponseBody注解的底层实现！！！
        String jsonString = JSON.toJSONString(ajaxResult);
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().println(jsonString);
        response.getWriter().flush();
        response.getWriter().close();
        return false;
    }
}